//
//  astarcpp.h
//  intmap
//
//  Created by liwei on 13-11-10.
//  Copyright (c) 2013年 liwei. All rights reserved.
//

#ifndef __intmap__astarcpp__
#define __intmap__astarcpp__

#include <iostream>
#include <list>
using namespace std;

typedef struct _POINT
{
    int x;
    int y;
}POINT;

//
// 路径节点结构体
//
struct TILE
{
    TILE( ){ x = y = f = g = h = 0; father = NULL; }
    TILE( int x, int y ){ this->x = x; this->y = y; father = NULL; }
    
    int x, y;
    int f, g, h;
    
    TILE * father;
};

const int BLOCK_SIZE = 48;

//
// 地图大小
//
const int MAP_WIDTH = 20;
const int MAP_HEIGHT = 16;

//
// 地图碰撞数据
//
// 0  可通行
// 1  不可通行
//

extern char map[ MAP_HEIGHT ][ MAP_WIDTH + 1];

////
//// 起始点与终点
////
extern POINT start;
extern POINT endp;

//
// 开放列表与封闭列表
//
extern list< TILE * > open_list;
extern list< TILE * > close_list;

//
// 寻路成功后用于保存路径
//
extern TILE * path;

//
// 添加新节点到 open list
//
extern void AddNodeToOpenList( TILE * father, int x, int y );

//
// 判断节点是否已经存在 open list 里面
//
extern bool NodeInOpenList( int x, int y );

//
// 添加特定节点的邻近节点到 open list
//
extern void AddAdjNodeToOpenList( TILE * father );

//
// 从 open list 中寻找最小 F 评价的节点
//
extern TILE * FindBestFNode( void );

//
// 从 open list 里面寻找 G 评价优于 node 的邻近节点
//
extern TILE * FindAdjBestGNode( TILE * node );

//
// 开始寻路, 仅进行四方向寻路
//
extern TILE * FindPath( int sx, int sy, int ex, int ey );

#endif /* defined(__intmap__astarcpp__) */
